package com.zys.el.user.util.TFIDF;

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

//逆向文件频率

public class IDF {

    static Map<String, Double> idf_map = new HashMap<String, Double>();
    // 存储词汇和该词汇的逆向文件频率

//    static Double ant = 2.0; // 总文档数量

    private static void calculate(Double ant) {  // 计算逆向文件频率
        for (String key : idf_map.keySet()) {
            idf_map.put(key, Math.log(ant / idf_map.get(key)));
        }
    }


    public static void idfFileRead(String idfText, Double ant) { // Java 的基础文件操作
        try {
//            File file = new File("");
//            if (file.equals(null) == true) {
//                System.out.println("读取失败");
//            }
            String str = "";
//            InputStreamReader reader = null;
//            reader = new InputStreamReader(new FileInputStream(file));
//            int tempchar;
//            int i = 1;
//            while ((tempchar = reader.read()) != -1) {
//                if ((char) tempchar >= 0x4e00 && (char) tempchar <= 0x9fbb)
//                    str += (char) tempchar;
//                i++;
//                System.out.println(i);
//            }
//            for (int i = 0; i < idfText.length(); i++) {
//                if (idfText.charAt(i) >= 0x4e00 && idfText.charAt(i) <= 0x9fbb)
//                    str += idfText.charAt(i);            //这块把所有不是汉字的过滤掉了
//            }
            idfText = idfText.replaceAll("\\\\", "");
            String regEx = "[`~!@#$%^&*() =。|{}'.:;'\\[\\]<>/?~@#￥%……&*]";//+号表示空格
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(idfText);
            str = m.replaceAll("").trim();
//            System.out.println(str);
            ansj(str, ant);        // 取出一个文件里所有汉字就进行一次分词
//            reader.close();


        } catch (Exception e) {
            e.printStackTrace();
        }
        calculate(ant);
    }

    public static void ansj(String str, Double ant) {  //分词操作同上TF类

        Set<String> Nature = new HashSet<String>();
        Nature.add("n");
        Nature.add("vn");
        Result result = ToAnalysis.parse(str); // 分词结果的一个封装，主要是一个List<Term>的terms

        List<Term> terms = result.getTerms(); // 拿到terms
        //System.out.println(terms.size());

        Map<String, Double> map = new HashMap<String, Double>();
        for (int i = 0; i < terms.size(); i++) {
            String word = terms.get(i).getName(); // 拿到词
            String natureStr = terms.get(i).getNatureStr(); //拿到词性
            if (Nature.contains(natureStr))
                map.put(word, map.getOrDefault(word, 0.0) + 1.0);
        }
        for (String key : map.keySet()) {
            idf_map.put(key, idf_map.getOrDefault(key, 0.0) + 1.0);
        }
    }

    public static Map<String, Double> getIdf_map(String idfText, Double ant) { // 将统计结果返回
        idfFileRead(idfText, ant);
        return idf_map;
    }
}
